﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLog;
using planerka.DataAccess.Models;


namespace planerka.DataAccess
{
    public interface IOrderable
    {
        int OrderBy { get; set; }
    }

    // для каждого класса должен быть свой провайдер и наследоватся от DataService
    public class sequenceProvider
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        // проставляем у обьектов OrderNumber
        public static void UpdateOrderNumber(List<IOrderable> itemList, linq2sqlDataContext context)
        {
            // списки нумеруются с нуля - проверим правильность заполнения
            for (var i = 0; i < itemList.Count; i++)
                itemList[i].OrderBy = i;

            context.SubmitChanges();
        }

        // возвращает false если ошибка сохранения
        // и если элемент находится в начале или конце списка
        public static bool Move(int curentOrderNumber, int delta, List<IOrderable> itemList, linq2sqlDataContext context)
        {
            itemList = itemList.OrderBy(p => p.OrderBy).ToList();
            try
            {
                // не к месту, лучше делать один раз при изменении или создании объекта
                UpdateOrderNumber(itemList, context);

                // мы находимся в конце списка и пытаемся перенести элемент в конец 
                // или мы находимся в начале списка и пытемся перенести элемент в начало
                if ((curentOrderNumber + delta >= itemList.Count) || (curentOrderNumber + delta < 0))
                    return false;

                // теперь просто поменяем местами два элемента
                var curentItem = itemList.Where(p => p.OrderBy == curentOrderNumber).FirstOrDefault();
                itemList.Where(p => p.OrderBy == (curentOrderNumber + delta)).First().OrderBy = curentOrderNumber;
                curentItem.OrderBy = curentOrderNumber + delta;
                context.SubmitChanges();
                return true;
            }
            catch (Exception ex)
            {
                LogEventInfo logEvent = new LogEventInfo();
                logEvent.Exception = ex;
                logEvent.Level = LogLevel.Error;
                logEvent.Message = "public static bool Move(int curentOrderNumber, int delta, List<IOrderable> itemList, siteDBDataContext context)";
                logEvent.TimeStamp = DateTime.Now;
                logger.Log(logEvent);

                return false;
            }


        }

     
    }
}